package com.wy._05Random.Enum;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 基于不同的环境下 不同的汉字可能无法显示
 * <p>
 * <p>
 * https://blog.csdn.net/gywtzh0889/article/details/71083459
 * 字符集	字数	Unicode 编码
 * 基本汉字	20902字	4E00-9FA5
 * 基本汉字补充	38字	9FA6-9FCB
 * 扩展A	6582字	3400-4DB5
 * 扩展B	42711字	20000-2A6D6
 * 扩展C	4149字	2A700-2B734
 * 扩展D	222字	2B740-2B81D
 * 康熙部首	214字	2F00-2FD5
 * 部首扩展	115字	2E80-2EF3
 * 兼容汉字	477字	F900-FAD9
 * 兼容扩展	542字	2F800-2FA1D
 * PUA(GBK)部件	81字	E815-E86F
 * 部件扩展	452字	E400-E5E8
 * PUA增补	207字	E600-E6CF
 * 汉字笔画	36字	31C0-31E3
 * 汉字结构	12字	2FF0-2FFB
 * 汉语注音	22字	3105-3120
 * 注音扩展	22字	31A0-31BA
 * 〇	1字	3007
 * <p>
 * <p>
 * 暂时先按照这个类型写枚举。
 * <p>
 * 汉字在unicode编码中不是连着的，是分散的，并且在持续补充中。
 * * 基本汉字：包含 20902 个字，Unicode 编码范围为 4E00-9FA5。
 * * 基本汉字补充：包含 90 个字，Unicode 编码范围为 9FA6-9FFF。
 * * 扩展 A：包含 6592 个字，Unicode 编码范围为 3400-4DBF。
 * * 扩展 B：包含 42720 个字，Unicode 编码范围为 20000-2A6DF。
 * * 扩展 C：包含 4154 个字，Unicode 编码范围为 2A700-2B739。
 * * 扩展 D：包含 222 个字，Unicode 编码范围为 2B740-2B81D。
 * * 扩展 E：包含 5762 个字，Unicode 编码范围为 2B820-2CEA1。
 * * 扩展 F：包含 7473 个字，Unicode 编码范围为 2CEB0-2EBE0。
 * * 扩展 G：包含 4939 个字，Unicode 编码范围为 30000-3134A。
 * * 扩展 H：包含 4192 个字，Unicode 编码范围为 31350-323AF。
 */

public enum CnCharacterEnum {
    Basic_Chinese_Character(UnicodeFragmentEnum.Basic_Chinese_Character),
    Basic_Chinese_Character_Supplement(UnicodeFragmentEnum.Basic_Chinese_Character_Supplement),
    Extension_A(UnicodeFragmentEnum.Extension_A),
    Extension_B(UnicodeFragmentEnum.Extension_B),
    Extension_C(UnicodeFragmentEnum.Extension_C),
    Extension_D(UnicodeFragmentEnum.Extension_D),
    Extension_E(UnicodeFragmentEnum.Extension_E),
    Extension_F(UnicodeFragmentEnum.Extension_F),
    Extension_G(UnicodeFragmentEnum.Extension_G),
    Extension_H(UnicodeFragmentEnum.Extension_H);
    private final UnicodeFragmentEnum unicodeFragmentEnum;
    // 集合基本的信息
    private static final int count = computerCount();
    private static final List<UnicodeFragment> unicodeFragmentList = computerUnicodeFragmentList();

    CnCharacterEnum(UnicodeFragmentEnum unicodeFragmentEnum) {
        this.unicodeFragmentEnum = unicodeFragmentEnum;
    }

    private static int computerCount() {
        CnCharacterEnum[] values = values();

        return Arrays.stream(values()).mapToInt(value -> value.getUnicodeFragmentEnum().getUnicodeFragment().getCount()).sum();
    }

    private static List<UnicodeFragment> computerUnicodeFragmentList() {
        return Arrays.stream(values()).map(xxx -> xxx.getUnicodeFragmentEnum().getUnicodeFragment()).collect(Collectors.toList());
    }

    public UnicodeFragmentEnum getUnicodeFragmentEnum() {
        return unicodeFragmentEnum;
    }

    public static int getCount() {
        return count;
    }

    public static List<UnicodeFragment> getUnicodeFragmentList() {
        return unicodeFragmentList;
    }


}
